home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 August: Tool Chest / Dev.CD Aug 94.toast / Tool Chest / Games / Game Sample Code / SpriteWorld 1.0b3 / Examples / SpaceRocks / RockSprite.c < prev    next >
Encoding:
Text File  |  1993-06-13  |  9.7 KB  |  382 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. // RockSprite.c
  3. //
  4. // Created: 6/18/92 at 4:41:49 PM
  5. // By:        Tony Myles
  6. //
  7. //    Copyright: © 1992-93 Tony Myles, All rights reserved worldwide.
  8. //
  9. ///--------------------------------------------------------------------------------------
  10.  
  11.  
  12. #ifndef __GAMEUTILS__
  13. #include <GameUtils.h>
  14. #endif
  15.  
  16. #ifndef __DEBUGUTILS__
  17. #include <DebugUtils.h>
  18. #endif
  19.  
  20. #ifndef __SPRITE__
  21. #include <Sprite.h>
  22. #endif
  23.  
  24. #ifndef __BLITPIXIE__
  25. #include <BlitPixie.h>
  26. #endif
  27.  
  28. #ifndef __SHIPSPRITE__
  29. #include "ShipSprite.h"
  30. #endif
  31.  
  32. #ifndef __ROCKSPRITE__
  33. #include "RockSprite.h"
  34. #endif
  35.  
  36.  
  37. extern RgnHandle gWorkRgn;
  38.  
  39.  
  40. ///--------------------------------------------------------------------------------------
  41. //        CreateRockSpriteInfo
  42. ///--------------------------------------------------------------------------------------
  43.  
  44. OSErr CreateRockSpriteInfo(
  45.     RockSpriteInfoPtr* rockSpriteInfoP,
  46.     SpriteWorldPtr spriteWorldP,
  47.     SpriteLayerPtr spriteLayerP)
  48. {
  49.     OSErr err;
  50.     RockSpriteInfoPtr tempRockSpriteInfoP;
  51.     short rockSpriteNum, numRockSprites, rockFrameNum;
  52.  
  53.     *rockSpriteInfoP = NULL;
  54.  
  55.     tempRockSpriteInfoP = (RockSpriteInfoPtr)NewPtrClear(sizeof(RockSpriteInfoRec));
  56.  
  57.     if (tempRockSpriteInfoP != NULL)
  58.     {
  59.         tempRockSpriteInfoP->rockSpriteLayerP = spriteLayerP;
  60.         tempRockSpriteInfoP->rockSpriteWorldP = spriteWorldP;
  61.         tempRockSpriteInfoP->rockWrapRect = spriteWorldP->backFrameP->frameRect;
  62.         tempRockSpriteInfoP->mediumRockInd = 0;
  63.         tempRockSpriteInfoP->smallRockInd = 0;
  64.  
  65.         err = CreateRockSpriteArray(
  66.                 tempRockSpriteInfoP,
  67.                 tempRockSpriteInfoP->largeRockSpriteArray,
  68.                 kLargeRockFrameResID,
  69.                 kNumberOfLargeRockFrames,
  70.                 kNumberOfLargeRockSprites);
  71.  
  72.         if (err == noErr)
  73.         {
  74.             err = CreateRockSpriteArray(
  75.                     tempRockSpriteInfoP,
  76.                     tempRockSpriteInfoP->mediumRockSpriteArray,
  77.                     kMediumRockFrameResID,
  78.                     kNumberOfMediumRockFrames,
  79.                     kNumberOfMediumRockSprites);
  80.         }
  81.  
  82.         if (err == noErr)
  83.         {
  84.             err = CreateRockSpriteArray(
  85.                     tempRockSpriteInfoP,
  86.                     tempRockSpriteInfoP->smallRockSpriteArray,
  87.                     kSmallRockFrameResID,
  88.                     kNumberOfSmallRockFrames,
  89.                     kNumberOfSmallRockSprites);
  90.         }
  91.  
  92.         if (err == noErr)
  93.         {
  94.             *rockSpriteInfoP = tempRockSpriteInfoP;
  95.         }
  96.     }
  97.     else
  98.     {
  99.         err = MemError();
  100.     }
  101.  
  102.     return err;
  103. }
  104.  
  105.  
  106. OSErr CreateRockSpriteArray(
  107.     RockSpriteInfoPtr rockSpriteInfoP,
  108.     SpritePtr *rockSpriteArray,
  109.     short rockResID,
  110.     short numberOfRockFrames,
  111.     short numberOfRockSprites)
  112. {
  113.     OSErr err;
  114.     short rockSpriteNum = 0;
  115.     SpritePtr rockSpriteP, newRockSpriteP;
  116.  
  117.     err = SWCreateSpriteFromCIconResource(&rockSpriteP, NULL, rockResID,
  118.             numberOfRockFrames, kFatMask);
  119.  
  120.     if (err == noErr)
  121.     {
  122.         rockSpriteP->userData = (long)rockSpriteInfoP;
  123.         rockSpriteArray[0] = rockSpriteP;
  124.  
  125.         for (rockSpriteNum = 1; rockSpriteNum < numberOfRockSprites; rockSpriteNum++)
  126.         {
  127.             err = SWCloneSprite(rockSpriteP, &newRockSpriteP, NULL);
  128.  
  129.             if (err == noErr)
  130.             {
  131.                 newRockSpriteP->userData = (long)rockSpriteInfoP;
  132.                 rockSpriteArray[rockSpriteNum] = newRockSpriteP;
  133.             }
  134.             else
  135.             {
  136.                 break;
  137.             }
  138.         }
  139.     }
  140.  
  141.     if (err != noErr)
  142.     {
  143.             // dispose of any sprites that we managed to create
  144.         numberOfRockSprites = rockSpriteNum;
  145.  
  146.         for (rockSpriteNum = 0; rockSpriteNum < numberOfRockSprites; rockSpriteNum++)
  147.         {
  148.             SWDisposeSprite(rockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
  149.         }
  150.     }
  151.  
  152.     return err;
  153. }
  154.  
  155.  
  156. void DisposeRockSpriteInfo(
  157.     RockSpriteInfoPtr rockSpriteInfoP)
  158. {
  159.     short rockSpriteNum;
  160.  
  161.     if (rockSpriteInfoP != NULL)
  162.     {
  163.         for (rockSpriteNum = 0; rockSpriteNum < kNumberOfLargeRockSprites; rockSpriteNum++)
  164.         {
  165.             SWDisposeSprite(rockSpriteInfoP->largeRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
  166.         }
  167.  
  168.         for (rockSpriteNum = 0; rockSpriteNum < kNumberOfMediumRockSprites; rockSpriteNum++)
  169.         {
  170.             SWDisposeSprite(rockSpriteInfoP->mediumRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
  171.         }
  172.  
  173.         for (rockSpriteNum = 0; rockSpriteNum < kNumberOfSmallRockSprites; rockSpriteNum++)
  174.         {
  175.             SWDisposeSprite(rockSpriteInfoP->smallRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
  176.         }
  177.  
  178.         DisposePtr((Ptr)rockSpriteInfoP);
  179.     }
  180. }
  181.  
  182.  
  183. void SetupRockSpriteInfo(
  184.     RockSpriteInfoPtr rockSpriteInfoP)
  185. {
  186.     register SpritePtr rockSpriteP;
  187.     short rockNum, horizVel, vertVel, horizLoc, vertLoc;
  188.  
  189.     for (rockNum = 0; rockNum < kNumberOfLargeRockSprites; rockNum++)
  190.     {
  191.         rockSpriteP = rockSpriteInfoP->largeRockSpriteArray[rockNum];
  192.  
  193.         SWLockSprite(rockSpriteP);
  194.  
  195.         horizLoc = (rockNum & 1) != 0 ?
  196.                         GetRandom(0, 100) :
  197.                         GetRandom(rockSpriteInfoP->rockWrapRect.right - 100,
  198.                                     rockSpriteInfoP->rockWrapRect.right);
  199.         vertLoc = GetRandom(20, rockSpriteInfoP->rockWrapRect.bottom - 20);
  200.  
  201.         horizVel = GetRandom(1, 5);
  202.         vertVel = GetRandom(1, 5);
  203.  
  204.         if (GetRandom(0, 1) == 0)
  205.         {
  206.             horizVel = -horizVel;
  207.         }
  208.  
  209.         if (GetRandom(0, 1) == 0)
  210.         {
  211.             vertVel = -vertVel;
  212.         }
  213.  
  214.         SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
  215.         SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
  216.         SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay);
  217.         SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
  218.         SWSetSpriteLocation(rockSpriteP, horizLoc, vertLoc);
  219.  
  220.         SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
  221.         SWSetSpriteFrameAdvance(rockSpriteP, 1);
  222.         SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastLargeRockFrame);
  223.  
  224.         SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
  225.         SWSetSpriteCollideProc(rockSpriteP, LargeRockCollideProc);
  226.     }
  227.  
  228.     for (rockNum = 0; rockNum < kNumberOfMediumRockSprites; rockNum++)
  229.     {
  230.         rockSpriteP = rockSpriteInfoP->mediumRockSpriteArray[rockNum];
  231.  
  232.         SWLockSprite(rockSpriteP);
  233.  
  234.         horizVel = GetRandom(1, 5);
  235.         vertVel = GetRandom(1, 5);
  236.  
  237.         if (GetRandom(0, 1) == 0)
  238.         {
  239.             horizVel = -horizVel;
  240.         }
  241.  
  242.         if (GetRandom(0, 1) == 0)
  243.         {
  244.             vertVel = -vertVel;
  245.         }
  246.  
  247.         SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
  248.         SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
  249.         SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay / 2);
  250.         SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
  251.  
  252.         SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
  253.         SWSetSpriteFrameAdvance(rockSpriteP, 1);
  254.         SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastMediumRockFrame);
  255.         
  256.         SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
  257.         SWSetSpriteCollideProc(rockSpriteP, MediumRockCollideProc);
  258.     }
  259.  
  260.     for (rockNum = 0; rockNum < kNumberOfSmallRockSprites; rockNum++)
  261.     {
  262.         rockSpriteP = rockSpriteInfoP->smallRockSpriteArray[rockNum];
  263.  
  264.         SWLockSprite(rockSpriteP);
  265.  
  266.         horizVel = GetRandom(1, 5);
  267.         vertVel = GetRandom(1, 5);
  268.  
  269.         if (GetRandom(0, 1) == 0)
  270.         {
  271.             horizVel = -horizVel;
  272.         }
  273.  
  274.         if (GetRandom(0, 1) == 0)
  275.         {
  276.             vertVel = -vertVel;
  277.         }
  278.  
  279.         SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
  280.         SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
  281.         SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay / 3);
  282.         SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
  283.  
  284.         SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
  285.         SWSetSpriteFrameAdvance(rockSpriteP, 1);
  286.         SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastSmallRockFrame);
  287.  
  288.         SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
  289.         SWSetSpriteCollideProc(rockSpriteP, SmallRockCollideProc);
  290.     }
  291. }
  292.  
  293.  
  294. void LargeRockCollideProc(
  295.     register SpritePtr rockSpriteP,
  296.     SpritePtr shotSpriteP,
  297.     Rect* sectRect)
  298. {
  299.     if (rockSpriteP->isVisible && shotSpriteP->isVisible)
  300.     {
  301.         RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
  302.         SpritePtr oneRockSprite, twoRockSprite;
  303.  
  304.         SWSetSpriteVisible(rockSpriteP, false);
  305.         SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
  306.  
  307.         oneRockSprite = rockSpriteInfoP->mediumRockSpriteArray[rockSpriteInfoP->mediumRockInd];
  308.         rockSpriteInfoP->mediumRockInd++;
  309.         twoRockSprite = rockSpriteInfoP->mediumRockSpriteArray[rockSpriteInfoP->mediumRockInd];
  310.         rockSpriteInfoP->mediumRockInd++;
  311.  
  312.         SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, oneRockSprite);            
  313.         SWSetSpriteLocation(oneRockSprite, rockSpriteP->destFrameRect.left, rockSpriteP->destFrameRect.top);
  314.  
  315.         SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, twoRockSprite);
  316.         SWSetSpriteLocation(twoRockSprite, rockSpriteP->destFrameRect.right, rockSpriteP->destFrameRect.bottom);
  317.  
  318.             // remove the shot
  319.         SWSetSpriteVisible(shotSpriteP, false);
  320.     }
  321. }
  322.  
  323.  
  324. void MediumRockCollideProc(
  325.     SpritePtr rockSpriteP,
  326.     SpritePtr shotSpriteP,
  327.     Rect* sectRect)
  328. {
  329.     if (rockSpriteP->isVisible && shotSpriteP->isVisible)
  330.     {
  331.         RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
  332.         SpritePtr oneRockSprite, twoRockSprite;
  333.  
  334.         SWSetSpriteVisible(rockSpriteP, false);
  335.         SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
  336.  
  337.         oneRockSprite = rockSpriteInfoP->smallRockSpriteArray[rockSpriteInfoP->smallRockInd];
  338.         rockSpriteInfoP->smallRockInd++;
  339.         twoRockSprite = rockSpriteInfoP->smallRockSpriteArray[rockSpriteInfoP->smallRockInd];
  340.         rockSpriteInfoP->smallRockInd++;
  341.  
  342.         SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, oneRockSprite);            
  343.         SWSetSpriteLocation(oneRockSprite, rockSpriteP->destFrameRect.left, rockSpriteP->destFrameRect.top);
  344.  
  345.         SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, twoRockSprite);
  346.         SWSetSpriteLocation(twoRockSprite, rockSpriteP->destFrameRect.right, rockSpriteP->destFrameRect.bottom);
  347.  
  348.             // remove the shot
  349.         SWSetSpriteVisible(shotSpriteP, false);
  350.     }
  351. }
  352.  
  353.  
  354. void SmallRockCollideProc(
  355.     SpritePtr rockSpriteP,
  356.     SpritePtr shotSpriteP,
  357.     Rect* sectRect)
  358. {
  359.     if (rockSpriteP->isVisible && shotSpriteP->isVisible)
  360.     {
  361.         SWSetSpriteVisible(rockSpriteP, false);
  362.         SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
  363.  
  364.             // remove the shot
  365.         SWSetSpriteVisible(shotSpriteP, false);
  366.     }
  367. }
  368.  
  369.  
  370. void RemoveRockMoveProc(
  371.     SpritePtr rockSpriteP,
  372.     Point* spritePoint)
  373. {
  374.     RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
  375.  
  376.     SWRemoveSprite(rockSpriteInfoP->rockSpriteLayerP, rockSpriteP);
  377.     SWSetSpriteVisible(rockSpriteP, true);
  378.     SWSetSpriteMoveProc(rockSpriteP, NULL);
  379. }
  380.  
  381.  
  382.